package br.boicotando.server;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import br.boicotando.dominio.CondicaoPagamento;


public class CondicaoPagamentoParser {
	private URL documento;


	public CondicaoPagamentoParser(URL url) throws IOException {
		documento = url;
	}

	private CondicaoPagamento bindCondicaoPagamento(NamedNodeMap attrs) {
		String attr;
		String value;
		CondicaoPagamento condicaoPagto = new CondicaoPagamento();
		for (int i = 0; (i < attrs.getLength()); ++i) {
			attr = attrs.item(i).getNodeName();
			value = attrs.item(i).getNodeValue();
			if (attr.equals("id")) {
				condicaoPagto.setId(value);
			} else if (attr.equals("bandeira")) {
				condicaoPagto.setBandeira(value);
			} else if (attr.equals("codigo_condicao_pagamento")) {
				condicaoPagto.setCodigoCondicaoPagamento(value);
			} else if (attr.equals("quantidade_parcelas")) {
				condicaoPagto.setQuantidadeParcelas(value);
			} else if (attr.equals("descricao")) {
				condicaoPagto.setDescricao(value);
			} 		}
		return condicaoPagto;
	}

	private void bind( List<CondicaoPagamento> condicaoPagto, Node node) {
		int type = node.getNodeType();
		switch (type) {
			case Node.DOCUMENT_NODE: {
				bind(condicaoPagto, ((Document) node).getDocumentElement());
				break;
			}
			case Node.ELEMENT_NODE: {
				NamedNodeMap attrs = node.getAttributes();
				if (node.getNodeName().equals("venda")) {
					CondicaoPagamento condicao = bindCondicaoPagamento(attrs);
					condicaoPagto.add(condicao);
				}
				if (node.hasChildNodes()) {
					NodeList children = node.getChildNodes();
					for (int i = 0; i < children.getLength(); i++) {
						bind(condicaoPagto, children.item(i));
					}
				}
				break;
			}
		}
	}

	public List<CondicaoPagamento> parse() throws Exception {
		List<CondicaoPagamento> condicao = new ArrayList<CondicaoPagamento>();
		DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
		docBuilderFactory.setIgnoringElementContentWhitespace(true);
		DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
		Document doc = docBuilder.parse(documento.openConnection().getInputStream());
		bind(condicao, doc);
		return condicao;
	}
}
